package com.th.coupon.service.impl;

import com.th.coupon.common.exception.BaseCloudException;
import com.th.coupon.common.vo.CouponTemplateSdk;
import com.th.coupon.common.vo.response.ExceptionResultData;
import com.th.coupon.dao.CouponTemplateDao;
import com.th.coupon.entity.CouponTemplate;
import com.th.coupon.service.ITemplateBaseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 优惠卷模板基础服务实现
 * @author 涂航
 */
@Slf4j
@Service
public class ITemplateBaseServiceImpl implements ITemplateBaseService {

    /**
     * 优惠卷模板持久层
     */
    private final CouponTemplateDao couponTemplateDao;

    @Autowired
    public ITemplateBaseServiceImpl(CouponTemplateDao couponTemplateDao) {
        this.couponTemplateDao = couponTemplateDao;
    }

    /**
     * 根据优惠卷模板id查询优惠卷模板
     * @param id 模板id
     * @return {@link CouponTemplate} 优惠卷模板实体
     * @throws BaseCloudException
     */
    @Override
    public CouponTemplate buildTemplateInfo(Integer id) throws BaseCloudException {
        Optional<CouponTemplate> optional = couponTemplateDao.findById(id);
        if(!optional.isPresent()){
            throw new BaseCloudException(ExceptionResultData.TEMPLATE_IS_NOT_EXIST);
        }
        return optional.get();
    }


    /**
     * 查找素有可用的优惠卷模板信息
     * @return {@link List} 优惠卷模板信息集合
     */
    @Override
    public List<CouponTemplateSdk> findAllUsableTemplate() {
        List<CouponTemplate> templates = couponTemplateDao.findAllByAvailableAndExpired(true, false);
        return templates.stream()
                .map(this::template2TemplateSDK)
                .collect(Collectors.toList());
    }

    /**
     *获取模板ids到CouponTemplateSdk的映射
     * @param ids 模板ids
     * @return {@link Map}
     */
    @Override
    public Map<Integer, CouponTemplateSdk> findIds2TemplateSdk(Collection<Integer> ids) {
        List<CouponTemplate> templates = couponTemplateDao.findAllById(ids);
        return templates.stream()
                .map(this::template2TemplateSDK)
                .collect(Collectors.toMap(CouponTemplateSdk::getId, Function.identity()));
    }

/**
     * 将CouponTemplate 转换为 CouponTemplateSDK
     * @param template {@link CouponTemplate} 优惠卷模板实体
     * @return {@link CouponTemplateSdk} 微服务之间交流优惠卷模板实体
     */
    private CouponTemplateSdk template2TemplateSDK(CouponTemplate template){
        return new CouponTemplateSdk(
                template.getId(),
                template.getName(),
                template.getLogo(),
                template.getDesc(),
                template.getCategory().getCode(),
                template.getProductLine().getCode(),
                template.getKey(),
                template.getTarget().getCode(),
                template.getRule()
        );
    }
}
